package com.ysw.rpc.common.config;

import com.ysw.rpc.common.utils.KryoUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Objects;

/**
 * @author YinShangwen
 * @since 2023/4/4 11:26
 */
public interface Serializer {
    /**
     * 序列化
     *
     * @param o 将要序列化的对象
     * @return 序列化完成的字节数组
     */
    byte[] ser(Object o);

    /**
     * 反序列化
     *
     * @param bytes 将要反序列化的字节数组
     * @param clazz 希望得到类型的class对象
     * @param <T>   希望得到的类型
     * @return 反序列化的结果
     */
    <T> T deser(byte[] bytes, Class<T> clazz);


    /**
     * 具体序列化类型
     */
    enum Type implements Serializer {
        /**
         * kryo
         */
        KRYO {
            @Override
            public byte[] ser(Object o) {
                return KryoUtil.encode(o);
            }

            @Override
            public <T> T deser(byte[] bytes, Class<T> clazz) {
                return KryoUtil.decode(bytes, clazz);
            }
        }
    }

    /**
     * 序列化类型映射关系
     */
    @Getter
    @AllArgsConstructor
    enum TypeMap {
        /**
         * kryo
         */
        KRYO("kryo", Type.KRYO);
        private final String code;
        private final Type type;

        /**
         * 获取枚举对象---根据code
         *
         * @param code code
         * @return enum
         */
        public static TypeMap get(String code) {
            for (TypeMap value : values()) {
                if (Objects.equals(value.getCode(), code)) {
                    return value;
                }
            }
            return KRYO;
        }
    }
}
